package BDD.gestionnaires; 

import javax.ejb.Stateless;

import java.util.Collection;  
import javax.ejb.Stateless;  
import javax.persistence.EntityManager;  
import javax.persistence.PersistenceContext;  
import javax.persistence.Query;  
import BDD.modeles.*;  
import javax.ejb.EJB;

/**
 * @version 1.0.0
 * @author AZRIA Nouriel
 */
@Stateless
public class GestionnairePhoto {

    // Ici injection de code : on n'initialise pas. L'entity manager sera créé  
    // à partir du contenu de persistence.xml  
    @PersistenceContext  
    private EntityManager em;

    // Le lien avec le gestionnaire d'albums
    @EJB
    private GestionnaireAlbum gestionnaireAlbum;
    
    /* LES METHODES */
    
    public Photo creePhoto(Album album, String url, String alt) {  
        
        // Creer la photo
        Photo p = new Photo(album, url, alt);
        p = em.merge(p);
        
        // Ajouter la photo dans l'album
        album.addPhoto(p);
        
        // Persister la photo
        em.persist(p);  
        return p;  
    }
    
    public Photo getPhotosById(int idPhoto){
        return em.find(Photo.class, idPhoto);
    }
    
    public Collection<Commentaire> getCommentaireOfPhotos(int idPhoto){
        Photo photo = em.find(Photo.class, idPhoto);
        return photo.getCommentaires();
    }
  
    public Collection<Photo> getAllPhotos() {  
        // Exécution d'une requête équivalente à un select *  
        Query q = em.createQuery("select p from Photo p");  
        return q.getResultList();  
    }  
    
    /**
     * Verifie si la photo existe sur le serveur
     * @param adresse
     * @return true ou false
     */
    public boolean photoExists(String adresse){ 

        // Initialiser le retour
        boolean exist = true;

        // Essayer de recuperer
        String rq = "SELECT p FROM Photo p WHERE p.url=:adresse";
        Query q = em.createQuery(rq);
        q.setParameter("adresse", adresse);
        q.setMaxResults(1);

        // Verifier s'il y a un resultat
        try{
            q.getSingleResult();
        } 
        catch(javax.persistence.NoResultException e){
            exist = false;
        }

        // Renvoyer le resultat
        return exist;
    }
    
    /**
     * Verifie si la photo existe (par son id)
     * @param idPhoto
     * @return true ou false
     */
    public boolean photoExists(int idPhoto){ 

         // Initialiser le retour
         boolean exist = true;

         // Essayer de recuperer
         String rq = "SELECT p FROM Photo p WHERE p.id=:idPhoto";
         Query q = em.createQuery(rq);
         q.setParameter("idPhoto", idPhoto);
         q.setMaxResults(1);

         // Verifier s'il y a un resultat
         try{
             q.getSingleResult();
         } 
         catch(javax.persistence.NoResultException e){
             exist = false;
         }

         // Renvoyer le resultat
         return exist;
    }
    
    /**
     * Methode eprmettant de recuperer une photo par son id
     * @param idPhoto
     * @return la photo ou null
     */
    public Photo recupererPhoto(int idPhoto){ 

        // Initialiser le retour
        Photo p = null;
        
         // Essayer de recuperer
         String rq = "SELECT p FROM Photo p WHERE p.id=:idPhoto";
         Query q = em.createQuery(rq);
         q.setParameter("idPhoto", idPhoto);
         q.setMaxResults(1);

         // Verifier s'il y a un resultat
         try{
             p = (Photo) q.getSingleResult();
         } 
         catch(javax.persistence.NoResultException e){}

         // Renvoyer le resultat
         return p;
    }
   
    
    public void supprimerPhoto(Photo p){
        
        // --- Reconnecter la photo --- //
        Photo photoConnecte = em.merge(p);
        photoConnecte = em.find(Photo.class, photoConnecte.getId());
        
        // --- Suppression de la photo --- //
        // ------------------------------- //
        
        // Retirer la photo de l'album
        Album albumConnecte = em.merge(photoConnecte.getAlbum());
        albumConnecte = em.find(Album.class, albumConnecte.getId());
        albumConnecte.removePhoto(photoConnecte);
        
        // Supprimer la photo de la base
        em.remove(photoConnecte);

    }
    
     /**
     * Methode permettant d'ajouter une photo a la BD
     * @param idAlbum id de l'album
     * @param cheminPhoto le chemin relatif de l'emplacement de la photo sur le serveur
     * @param nomPhoto le nom de la photo
     */
    public void ajouterPhotoBD(int idAlbum, String cheminPhoto, String nomPhoto) {
        
        // Recuperer l'album
        Album a = gestionnaireAlbum.getAlbum(idAlbum);

        // Creer la photo si non existante
        if(!photoExists(cheminPhoto))
            creePhoto(a, cheminPhoto, nomPhoto);

    }

    public Utilisateur getOwnerOf(Photo photo) {
        return em.merge( em.merge(photo).getAlbum() ).getUtilisateur();
    }
    
}
